﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using GestionePolveri2.DAL;
using GestionePolveriLib.BL;
using FrameworkLib.Facades;

namespace GestionePolveriLib.Facades
{
    [Serializable]
    public class ScatoleFacade : FacadeBase<GestionePolveriEntities>
    {
        public ScatoleFacade()
        {

        }

        public void LoadScatoleAsync(BackgroundWorkerCallbackBase.Callback callback)
        {
            this.RunAsync(() => GetScatole(), callback);
        }

        public List<Scatola> GetScatole()
        {
            List<Scatola> retValue = null;

            try
            {
                var obj = from x in this.GetContext().FormatoScatole
                          select new Scatola
                          {
                              ID = x.IDFormato,
                              Formato = x.Formato,
                              Pezzatura = x.Pezzatura
                          };

                if (obj.Any())
                {
                    retValue = obj.ToList();
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public bool AddScatola(Scatola scatola)
        {
            bool retValue = false;

            try
            {
                FormatoScatole obj = new FormatoScatole();
                obj.Formato = scatola.Formato;
                obj.Pezzatura = scatola.Pezzatura;

                this.GetContext().FormatoScatole.AddObject(obj);
                this.GetContext().SaveChanges();

                retValue = true;
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public bool DeleteScatola(Scatola scatola)
        {
            bool retValue = false;

            try
            {
                var obj = from x in this.GetContext().FormatoScatole
                          where x.IDFormato == scatola.ID
                          select x;

                if (obj.Any())
                {
                    this.GetContext().FormatoScatole.DeleteObject(obj.FirstOrDefault());
                    this.GetContext().SaveChanges();

                    retValue = true;
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public bool ModifyScatola(Scatola scatola)
        {
            bool retValue = false;

            try
            {
                var obj = from x in this.GetContext().FormatoScatole
                          where x.IDFormato == scatola.ID
                          select x;

                if (obj.Any())
                {
                    FormatoScatole imp = obj.FirstOrDefault();
                    imp.Pezzatura = scatola.Pezzatura;
                    imp.Formato = scatola.Formato;

                    this.GetContext().SaveChanges();

                    retValue = true;
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public Scatola GetScatola(string pezzatura)
        {
            Scatola retValue = null;

            try
            {
                var obj = from x in this.GetContext().FormatoScatole
                          where x.Pezzatura == short.Parse(pezzatura)
                          select new Scatola
                          {
                              ID = x.IDFormato,
                              Pezzatura = x.Pezzatura,
                              Formato = x.Formato
                          };

                if (obj.Any())
                {
                    retValue = obj.FirstOrDefault();
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public Scatola GetScatolaByLotto(long idlotto, string causale)
        {
            Scatola retValue = null;

            try
            {
                var obj = from x in this.GetContext().Movimenti
                          where x.IDLotto == idlotto && x.CausaliMagazzino.CodCausale == causale
                          select new Scatola
                          {
                              ID = x.FormatoScatole.IDFormato,
                              Pezzatura = x.FormatoScatole.Pezzatura,
                              Formato = x.FormatoScatole.Formato
                          };

                if (obj.Any())
                {
                    retValue = obj.FirstOrDefault();
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }
    }
}
